package com.ybxx.core.util;

import java.math.BigDecimal;

/**
 * 功能：辅助类，将阿拉伯数字转换成汉字
 * */
public class NumberUtil {

	private static String bigLetter[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
    private static String unit[] = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万" };
    private static String unitSmall[] = { "分", "角" };
    
    public static String Sign(String pValue) {
		return pValue.indexOf("-") == 0 ? "负" : "";
		}

    public static String trans(String str) {
        BigDecimal dec = check2BigDecimal(str);
        if (dec == null)
            return null;
        java.text.DecimalFormat df=  new java.text.DecimalFormat("0.00");
        str = df.format(dec);
        String[] sArr = str.split("\\.");
        String intOnly = sArr[0];
        String smallOnly = "";
        if (sArr.length == 2)
            smallOnly = sArr[1];
        if (smallOnly.length() > 2) {
            smallOnly = smallOnly.substring(0, 2);
        }
        return transInt(intOnly) + transSmall(smallOnly);
    }
    public static String transInt(String str) {
        if ("0".equals(str))
            return "";
        StringBuffer newS = new StringBuffer();
        char[] cArr = str.toCharArray();
        for (int i = 0; i < cArr.length; i++) {
            String u = unit[cArr.length - i - 1];
            int position = "元万亿".indexOf(u);
            // 遇到零，特殊处理
            if (cArr[i] == '0') {
                // 如果零在特殊位置上：比如个位，万位，亿位
                if (position >= 0) {
                    // 如果零在个位：需要加上单位“元”
                    if (position == 0) {
                        newS.append(unit[cArr.length - i - 1]);
                        continue;
                    } else {// 如果零不在个位
                        // 零不在个位，且这个位后，紧跟着一个零：只需要加上单位
                        if (i < cArr.length - 1 && cArr[i + 1] == '0') {
                            newS.append(unit[cArr.length - i - 1]);
                            continue;
                        } else {// 零不在个位，且这个位后，没有紧跟着一个零：需要加上单位和大写数字(注意次序：单位在前，大写数字在后)
                            newS.append(unit[cArr.length - i - 1]);
                            newS.append(bigLetter[cArr[i] - 48]);
                            continue;
                        }
                    }
                } else {// 零不在特殊位置上
                    // 零不在特殊位置上，且这个位后，紧跟着一个零：忽略这个零
                    if (i < cArr.length - 1 && cArr[i + 1] == '0') {
                        continue;
                    }
                    // 零不在特殊位置上，且这个位后，没有紧跟着一个零：需要加上大写数字
                    newS.append(bigLetter[cArr[i] - 48]);
                    continue;
                }
            }
            // 不是零，常规处理
            newS.append(bigLetter[cArr[i] - 48]);
            newS.append(unit[cArr.length - i - 1]);
        }
        return newS.toString();
    }
    public static String transSmall(String str) {
        // 因为最多精确到分，所有str的长度最多位2
        if (str == null || "".equals(str))
            return "";
        char[] cArr = str.toCharArray();
        if (str.indexOf("0") == -1) {// 不含有零，常规处理
            StringBuffer newS = new StringBuffer();
            for (int i = 0; i < cArr.length; i++) {
                newS.append(bigLetter[cArr[i] - 48]);
                newS.append(unitSmall[cArr.length - i - 1]);
            }
            return newS.toString();
        } else {// 含有零，分情况考虑
            if (cArr[0] == '0' && cArr[cArr.length == 2 ? 1 : 0] == '0')// 两个都为零
                return "";
            if (cArr[0] == '0' && cArr.length == 2 && cArr[1] != '0')// 角位为零，分位不为零
                return bigLetter[0] + bigLetter[cArr[1] - 48] + unitSmall[0];
            if (cArr[0] != '0' && cArr.length == 2 && cArr[1] == '0')// 分位为零，角位不为零
                return bigLetter[cArr[0] - 48] + unitSmall[1];
        }
        return "";
    }
    public static BigDecimal check2BigDecimal(String str) {
        try {
            double f = Double.valueOf(str);// 0.0 0.1 -5 ""
            /*if (f < 0)
                System.out.println("输入数据小于0，请检查！");*/
            return new BigDecimal(f);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public static void main(String[] args) {
        //字符串 
        String str = "-10040.05";
        Double d = Math.abs(Double.parseDouble(str));
        String str1 = d.toString();
        String result = NumberUtil.Sign(str)+NumberUtil.trans(str1);
        System.out.println(result);
        
    }
}
